package com.kukudexin.producerdata;

/**
 * @author: 酷酷的鑫
 * @Date: 2022/1/20 17:53
 * @description:  线程生产消费模式  定义一个操作数据的类
 */
public class ValueOP {
    private String value = "";

    //定义方法修改 value 字段的值
    public void setValue() {
        synchronized (this) {
            //如果 value 值不是""空串就等待
            while (!value.equalsIgnoreCase("")) {
                try {
                    Thread.sleep(500);
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //如果 value 字段值是容串, 就设置 value 字段的值
            String value = System.currentTimeMillis() + " - " + System.nanoTime();
            System.out.println(Thread.currentThread().getName() + "----set 设置的值是: " + value);
            this.value = value;
//            this.notify();
            //在多生产者多消费者环境中,notify()不能保证是生产者唤醒消费者,如果生产者唤醒的还是生产者可能会出现假死的情况
            this.notifyAll();
        }
    }
    //定义方法读取字段值
    public void getValue() {
        synchronized (this) {
            //如果 value 是空串就等待
            while (value.equalsIgnoreCase("")) {
                try {
                    Thread.sleep(500);
                    System.out.println(Thread.currentThread().getName());
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //不是空串,读取 字段值
            System.out.println(Thread.currentThread().getName() + "----get 的值是: " + this.value);
            this.value = "";
            this.notifyAll();
        }
    }
}


